草庐IT

C++ make_shared 不可用

全部标签

c++ - Make_shared - 自己的实现

我正在尝试自己实现shared_ptr。make_shared有问题。std::make_shared的主要特点是它在连续的内存块中分配计数器block和对象。我怎样才能做同样的事情?我试过这样做:templateclassshared_ptr{private:class_ref_cntr{private:longcounter;public:_ref_cntr():counter(1){}voidinc(){++counter;}voiddec(){if(counter==0){throwstd::logic_error("alreadyzero");}--counter;}long

c++ - 尝试执行 shared_ptr swap() 时出现奇怪错误

我是一个相对的C++新手,试图将一个现有项目从原始指针转换为使用C++11的shared_ptr.总的来说进展非常顺利,我认为我理解如何shared_ptr在移动语义、右值引用等方面工作。好东西。但是,我遇到了一个奇怪的错误,我不明白也不知道如何修复。先介绍一点背景。我有一个根植于名为EidosValue的抽象基类的类层次结构,和一个名为EidosValue_Int_vector的类是(间接地)一个具体的子类:classEidosValueclassEidosValue_Int:publicEidosValueclassEidosValue_Int_vector:publicEidos

c++ - 从 Qt 5.6 切换到 Qt 5.7 - 命名空间 std 中的 "no member ' make_unique'

我有一个CMakeQt项目,它使用了多个c++14功能,包括std::make_unique。通常这将通过以下方式处理:LIST(APPENDCMAKE_CXX_FLAGS-std=c++14)或ADD_COMPILE_OPTIONS(-std=c++14)我想将项目从5.6版升级到5.7版,但在测试构建期间出现多次失败并出现错误nomember'make_unique'innamespacestd我已验证所有适当的header和编译选项都已到位,并排除了任何环境问题。使用Qt5.7绝对是个问题。有什么解决方法吗? 最佳答案 原来这

c++ - 有什么方法可以欺骗 std::make_shared 使用默认初始化吗?

您应该使用std::make_shared确保带有计数器的block存储在数据旁边。不幸的是内部std::make_shared对T使用零初始化(即使用T()来初始化数据block)。有什么办法可以让它使用默认初始化吗?我知道我可以使用std::shared_ptr(newT,[](autop){deletep;}),但我最终会在这里进行两次分配(数据和计数器block不会彼此相邻)。 最佳答案 创建一个派生类来执行简单的构造。structD:T{D(){}//Non-trivialconstructor.Default-initi

c++ - 是否不可能将对 const 指针的引用返回到 const 数据?

我在尝试将reference返回到指向const数据的const指针时遇到了一些问题。在以下代码中,get_pC返回对指向数据的const指针的引用:#includeusingnamespacestd;classC{public:doublec;};classA{public:C*pC;A(constdoubleval):pC(newC){pC->c=val;};};classB{public:constA*pA;B(constA&a):pA(&a){};C*const&get_pC()const{returnpA->pC;}};intmain(){Aa(3.7);Bb(a);C*co

c++ - reference_wrapper : make_pair VS Class Template Argument Deduction (CTAD)

为什么make_pair和类模板参数推导(CTAD)不同意生成哪种类型?#include#include#include#includeintmain(){intmyInt=5;std::reference_wrappermyIntRef=myInt;automyPair=std::make_pair(myInt,myIntRef);std::pairMy2ndPair(myInt,myIntRef);std::cout输出:St4pairIiRiE//std::pairSt4pairIiSt17reference_wrapperIiEE//std::pair>更新:为什么std::p

c# - 将 shared_ptr 与托管语言引用进行比较

有人可以向C++程序员解释Java(以及C#)引用和shared_ptr(来自Boost或C++0x)之间最重要的区别。我或多或少知道shared_ptr是如何实现的。我很好奇以下方面的差异:1)性能。2)骑自行车。shared_ptr可以循环(A和B持有指向彼此的指针)。在Java中可以骑自行车吗?3)还有什么吗?谢谢。 最佳答案 性能:shared_ptr性能不错,但根据我的经验,它的效率略低于显式内存管理,主要是因为它是引用计数的,并且必须分配引用计数以及。它的性能如何取决于很多因素,它与Java/C#垃圾收集器相比的性能如何

c++ - 我应该在使用之前检查 boost::shared_ptr 或 std::shared_ptr 吗?

voidf(boost::shared_ptrptr){if(ptr)//shouldwecheck?//dosomething}voidf2(int*p){if(p)//goodpracticetocheckbeforeusingit//dosomething}问题:我们是否应该在使用前验证shared_ptr? 最佳答案 没有。如果在函数的约定中它必须是有效的,那么引起人们注意调用者有错误这一事实的最快方法就是崩溃。尽早失败。 关于c++-我应该在使用之前检查boost::share

c++ - STL 容器和不可复制(和不可移动)的对象

由于STL容器要求所有内容都是可复制和可分配的,那么在处理不可复制的对象时首选的习惯用法是什么?我可以想到两种不同的方法:在STL容器中存储(智能)指针而不是对象。摆脱STL容器并实现我自己的列表(例如,每个对象必须包含指向下一个对象的指针)。第二种方法的主要缺点是析构函数的实现(是否应该以递归方式在当前对象之前销毁“下一个”对象?) 最佳答案 SinceSTLcontainersrequirethatallcontentsbecopyableandassignable,whatisthepreferedidiomwhenworki

c++ - 多态性和 shared_ptr 成员

测试多态性&虚函数&shared_ptr,我试图理解以下最小示例描述的情况。classB{public://DefinitionofclassBvirtualvoidsomeBMethod(){//Makeaburger};};classC:publicB{public://DefinitionofclassCvoidsomeBMethod(){//Makeapizza};};classA{public:A(B&SomeB):Member(std::make_shared(SomeB)){};std::shared_ptrMember;};现在,我们基本上可以拥有intmain(){C